﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Data;
using Site_IEQ.IEQ_DAL;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace Site_IEQ.Controls
{
    public partial class Cadastro_Conteudo : System.Web.UI.UserControl
    {
        // Contante para armazenar nome do Grupo/Depto  no ViewState
        private const string KEY_NOME_GRUPO_DEPTO = "__NOME_GRUPO_DEPTO";
        private static string Session_Name = string.Empty;

        private Boolean updateImage = false;

        #region Properties

        public Boolean IsAdmin
        {
            get { return _is_admin; }
            set { _is_admin = value; }
        } private bool _is_admin;

        public String Nome_Grupo
        {
            get { return _nome_grupo; }
            set { _nome_grupo = value; }
        } private string _nome_grupo;

        public String Presidente
        {
            get { return _presidente; }
            set { _presidente = value; }
        } private string _presidente;

        public String Assessor_Nome
        {
            get { return _assessor_nome; }
            set { _assessor_nome = value; }
        } private string _assessor_nome;

        public String Assessor_Telefone
        {
            get { return _assessor_telefone; }
            set { _assessor_telefone = value; }
        } private string _assessor_telefone;

        public String Assessor_Email
        {
            get { return _assessor_email; }
            set { _assessor_email = value; }
        } private string _assessor_email;

        public String Texto_Resumido
        {
            get { return _texto_resumido; }
            set { _texto_resumido = value; }
        } private string _texto_resumido;

        public String Texto_Completo
        {
            get { return _texto_completo; }
            set { _texto_completo = value; }
        } private string _texto_completo;

        public String Dia_Reuniao
        {
            get { return _dia_reuniao; }
            set { _dia_reuniao = value; }
        } private String _dia_reuniao;

        public String Hora_Inicio
        {
            get
            { return _hora_inicio; }
            set { _hora_inicio = value; }
        } private String _hora_inicio;

        public String Hora_Final
        {
            get { return _hora_final; }
            set { _hora_final = value; }
        } private String _hora_final;

        public DateTime Data_Fundacao
        {
            get { return _data_fundacao; }
            set { _data_fundacao = value; }
        } private DateTime _data_fundacao;

        public Byte[] Foto
        {
            get { return _foto; }
            set { _foto = value; }
        } private Byte[] _foto;

        #endregion

        public String[] Dias_Semana()
        {
            string dias = "Segunda,Terça,Quarta,Quinta,Sexta,Sábado,Domingo";
            return dias.Split(',');
        }

        public static DsGrupoDepto.IEQ_GRUPO_DEPTORow CurrentGrupoDepto
        {
            get
            {
                if (_grupo_depto_row.ID_GRUPO_DEPTO == -1)
                {
                    DsGrupoDepto.IEQ_GRUPO_DEPTODataTable dtGrupoDepto = new DsGrupoDepto.IEQ_GRUPO_DEPTODataTable();
                    return dtGrupoDepto.NewIEQ_GRUPO_DEPTORow();
                }
                else
                    return _grupo_depto_row;
            }
            set { _grupo_depto_row = value; }
        } private static DsGrupoDepto.IEQ_GRUPO_DEPTORow _grupo_depto_row;

        protected void Page_Load(object sender, EventArgs e)
        {
            InitSession();

            if (!IsPostBack)
            {
                Nome_Grupo = Request.QueryString["GrupoDepto"];
                if (!String.IsNullOrEmpty(Nome_Grupo))
                {
                    // Inicia controles
                    //ViewState.Add(KEY_NOME_GRUPO_DEPTO, Nome_Grupo);
                    IsAdmin = Nome_Grupo.Equals("admin");
                    InitControls();
                }
            }
            else
            {
                Nome_Grupo = Request.QueryString["GrupoDepto"];
                if (String.IsNullOrEmpty(Nome_Grupo))
                {
                    Response.Redirect(String.Format("\\areainterna\\Login.aspx"));
                }

                // Verifica se foi alterada a QueryString
                if (!Request.QueryString["GrupoDepto"].Equals(Nome_Grupo))
                {
                    // Tratamento nao funcionou...
                    // O ViewState chega vazio...
                }

                // Seta propertie IsAdmin
                IsAdmin = Nome_Grupo.Equals("admin");

                if (IsAdmin)
                {
                    if (ddlGrupoDepto.SelectedIndex > 0)
                    {
                        Nome_Grupo = ddlGrupoDepto.SelectedValue;
                        //ViewState.Add(KEY_NOME_GRUPO_DEPTO, Nome_Grupo);
                    }
                }
                else
                {
                    Nome_Grupo = lblGrupoDepto.Text;
                    //ViewState.Add(KEY_NOME_GRUPO_DEPTO, Nome_Grupo);
                }

                CurrentGrupoDepto = IEQ_Data.GetGrupoDeptoRow(Nome_Grupo);
            }
        }

        private void InitSession()
        {
            if (String.IsNullOrEmpty(Request.QueryString["GrupoDepto"]))
            {
                Session.Add("MsgError", "Erro: Usuário não informado ou não autenticado.");
                Response.Redirect("\\PageError.aspx");
            }

            Nome_Grupo = Request.QueryString["GrupoDepto"];
            if (Session_Name.Equals(string.Empty))
                Session_Name = Nome_Grupo;
            else if (!Session_Name.Equals(Nome_Grupo))
            {
                String msgInstrucao = "Feche a página e acesse novamente.";
                Session.Add("MsgError", String.Format("Já foi feito login com usuário: {0}. {1} {2}", Session_Name, Environment.NewLine, msgInstrucao));
                Response.Redirect(("\\areainterna\\Login.aspx"), false);
            }

        }

        private void InitControls()
        {

            if (String.IsNullOrEmpty(Nome_Grupo))
            {
                Response.Redirect(String.Format("\\areainterna\\Login.aspx"));
            }

            try
            {
                CurrentGrupoDepto = IEQ_Data.GetGrupoDeptoRow(Nome_Grupo);
            }
            catch (Exception ex)
            {
                Session.Add("MsgError", ex.Message);
                Response.Redirect("\\PageError.aspx");
            }

            if (IsAdmin)
            {
                ddlGrupoDepto.Items.Clear();
                ddlGrupoDepto.Items.Add("[Selecione o nome]");
                foreach (DsGrupoDepto.IEQ_GRUPO_DEPTORow row in IEQ_Data.GetAllGrupoDepto().Rows)
                    ddlGrupoDepto.Items.Add(row.NOME.Trim());
            }
            lblGrupoDepto.Visible = !IsAdmin;
            ddlGrupoDepto.Visible = IsAdmin;
            lblMsgImage.Visible = false;
            updateImage = false;
            lblGrupoDepto.Text = Nome_Grupo.ToUpper();
            ddlDiaReuniao.Items.Clear();
            ddlDiaReuniao.Items.Add("[Selecione o dia]");
            foreach (string dia in Dias_Semana())
                ddlDiaReuniao.Items.Add(dia);

            if (!String.IsNullOrEmpty(Nome_Grupo))
                ddlGrupoDepto.SelectedValue = Nome_Grupo;

            LoadControls();
        }

        private void LoadControls()
        {
            try
            {

                if ((!IsAdmin && !String.IsNullOrEmpty(lblGrupoDepto.Text) && CurrentGrupoDepto != null) || (IsAdmin && ddlGrupoDepto.SelectedIndex > 0 && CurrentGrupoDepto != null))
                {
                    tbPresidente.Text = CurrentGrupoDepto.IsPRESIDENTENull() ? string.Empty : CurrentGrupoDepto.PRESIDENTE.Trim();
                    tbAssessor.Text = CurrentGrupoDepto.IsASS_COMUN_NOMENull() ? string.Empty : CurrentGrupoDepto.ASS_COMUN_NOME.Trim();
                    tbAssTelefone.Text = CurrentGrupoDepto.IsASS_COMUN_TELEFONENull() ? string.Empty : CurrentGrupoDepto.ASS_COMUN_TELEFONE.Trim();
                    tbAssEmail.Text = CurrentGrupoDepto.IsASS_COMUN_EMAILNull() ? string.Empty : CurrentGrupoDepto.ASS_COMUN_EMAIL.Trim();
                    tbDataFundacao.Text = CurrentGrupoDepto.IsDATA_FUNDACAONull() ? string.Empty : CurrentGrupoDepto.DATA_FUNDACAO.ToString("dd/MM/yyyy");
                    ddlDiaReuniao.SelectedValue = CurrentGrupoDepto.IsDIA_REUNIAONull() ? ddlDiaReuniao.Items[0].ToString() : CurrentGrupoDepto.DIA_REUNIAO.Trim();
                    tbHoraInicio.Text = CurrentGrupoDepto.IsHORA_REUNIAO_INICIONull() ? string.Empty : CurrentGrupoDepto.HORA_REUNIAO_INICIO;
                    tbHoraFinal.Text = CurrentGrupoDepto.IsHORA_REUNIAO_FINALNull() ? string.Empty : CurrentGrupoDepto.HORA_REUNIAO_FINAL;
                    TextResumido.Text = CurrentGrupoDepto.IsDESCRICAO_RESUMIDANull() ? string.Empty : CurrentGrupoDepto.DESCRICAO_RESUMIDA.Trim();
                    TextCompleto.Text = CurrentGrupoDepto.IsDESCRICAO_COMPLETANull() ? string.Empty : CurrentGrupoDepto.DESCRICAO_COMPLETA.Trim();
                    LoadFotoGrupoDepto(Nome_Grupo);
                }
                else
                {
                    tbPresidente.Text = string.Empty;
                    tbAssessor.Text = string.Empty;
                    tbAssTelefone.Text = string.Empty;
                    tbAssEmail.Text = string.Empty;
                    tbDataFundacao.Text = string.Empty;
                    ddlDiaReuniao.SelectedIndex = 0;
                    tbHoraInicio.Text = string.Empty;
                    tbHoraFinal.Text = string.Empty;
                    TextResumido.Text = string.Empty;
                    TextCompleto.Text = string.Empty;
                    imgFoto.Visible = false;
                }
            }
            catch (Exception ex)
            {
                Session.Add("MsgError", ex.Message);
                Response.Redirect("\\PageError.aspx");
            }
        }

        private void LoadFotoGrupoDepto(string nome)
        {
            String urlImage = string.Empty;
            String path = MapPath("imgs_grupo_depto");

            DsGrupoDepto.IEQ_GRUPO_DEPTORow row = CurrentGrupoDepto;

            if (!row.IsFOTO_APRESENTACAONull() && row.FOTO_APRESENTACAO.Length > 0)
            {
                try
                {
                    MemoryStream ms = new MemoryStream(row.FOTO_APRESENTACAO);
                    System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
                    ImageFormat contentType = ImageHelper.GetContentType(row.FOTO_APRESENTACAO);
                    string fileName = Nome_Grupo + "." + contentType.ToString();
                    path += "\\" + fileName;

                    FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
                    fs.Write(row.FOTO_APRESENTACAO, 0, row.FOTO_APRESENTACAO.Length);
                    fs.Close();

                    string pathUrl = "imgs_grupo_depto/" + fileName;
                    imgFoto.ImageUrl = pathUrl;
                    imgFoto.Visible = true;
                }
                catch (Exception ex)
                {
                    LoadImageNotFound();
                }
            }
            else
            {
                LoadImageNotFound();
            }
        }

        private void LoadImageNotFound()
        {
            imgFoto.ImageUrl = "/images/icones/not_image.png";
            imgFoto.Width = System.Web.UI.WebControls.Unit.Pixel(120);
            imgFoto.Height = System.Web.UI.WebControls.Unit.Pixel(120);
            imgFoto.Visible = true;
        }

        private bool UploadFoto()
        {
            bool save = false;
            bool validExtension = false;
            string[] validExtensions = { ".png", ".jpg", ".gif", ".jpeg", ".bmp" };

            // Verifica se o arquivo foi selecionado
            if (FileUploadFoto.HasFile)
            {
                try
                {
                    string extensionFile = Path.GetExtension(FileUploadFoto.FileName);
                    foreach (string extension in validExtensions)
                        if (extensionFile == extension)
                            validExtension = true;

                    if (validExtension)
                    {
                        HttpPostedFile File = FileUploadFoto.PostedFile;
                        BinaryReader binRead = new BinaryReader(File.InputStream);
                        byte[] data = binRead.ReadBytes(File.ContentLength);
                        Foto = data;
                        save = true;
                        updateImage = true;
                    }
                    else
                    {
                        lblValidation.Text = String.Format("O tipo da imagem selecionada não é suportada: {0}", extensionFile);
                        lblValidation.Visible = true;
                    }
                }
                catch (Exception ex)
                {
                    lblValidation.Text = String.Format("Erro ao salvar imagem. {0}{1}Detalhe: {2}", ex.Message, Environment.NewLine, ex.Message);
                    lblValidation.Visible = true;
                }
            }
            else
            {
                // Foto já cadastrada e nao alterada.
                if (!CurrentGrupoDepto.IsFOTO_APRESENTACAONull() && CurrentGrupoDepto.FOTO_APRESENTACAO.Length > 0)
                {
                    Foto = CurrentGrupoDepto.FOTO_APRESENTACAO;
                    save = true;
                }
            }

            return save;
        }

        private Boolean ValidateControls()
        {
            lblValidation.Visible = false;
            DateTime hora_inicio = DateTime.MinValue;
            DateTime hora_final = DateTime.MinValue;

            if (IsAdmin && ddlGrupoDepto.SelectedIndex == -1)
            {
                lblValidation.Text = "É necessário selecionar um grupo/departamento";
                lblValidation.Visible = true;
                ddlGrupoDepto.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(tbPresidente.Text))
            {
                lblValidation.Text = "É necessário informar o nome do Presidente.";
                lblValidation.Visible = true;
                tbPresidente.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(tbAssessor.Text))
            {
                lblValidation.Text = "É necessário informar o nome do Assessor de Comunicação.";
                lblValidation.Visible = true;
                tbAssessor.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(tbAssEmail.Text))
            {
                lblValidation.Text = "É necessário informar o Email do Assessor de Comunicação.";
                lblValidation.Visible = true;
                tbAssEmail.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(tbAssTelefone.Text))
            {
                lblValidation.Text = "É necessário informar o telefone do Assessor de Comunicação.";
                lblValidation.Visible = true;
                tbAssTelefone.Focus();
                return false;
            }
            else if (ddlDiaReuniao.SelectedIndex == -1)
            {
                //lblValidation.Text = "É necessário informar o dia da reunião oficial.";
                //lblValidation.Visible = true;
                //return false;
            }
            else if (!DateTime.TryParse(tbHoraInicio.Text, out hora_inicio))
            {
                if (ddlDiaReuniao.SelectedIndex > 0)
                {
                    lblValidation.Text = String.Format("É necessário informar o horário de início da reunião oficial no(a) {0}.", ddlDiaReuniao.SelectedValue);
                    lblValidation.Visible = true;
                    tbHoraInicio.Focus();
                    return false;
                }
            }
            else if (!DateTime.TryParse(tbHoraFinal.Text, out hora_final))
            {
                if (ddlDiaReuniao.SelectedIndex > 0)
                {
                    lblValidation.Text = String.Format("É necessário informar o horário de início da reunião oficial no(a) {0}.", ddlDiaReuniao.SelectedValue);
                    lblValidation.Visible = true;
                    tbHoraFinal.Focus();
                    return false;
                }
            }
            else if (String.IsNullOrEmpty(TextResumido.Text))
            {
                lblValidation.Text = "O texto resumido não foi cadastrado.";
                lblValidation.Visible = true;
                TextResumido.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(TextCompleto.Text))
            {
                lblValidation.Text = "O texto completo não foi cadastrado.";
                lblValidation.Visible = true;
                TextCompleto.Focus();
                return false;

            }
            else if (!UploadFoto())
            {
                lblValidation.Text = "A foto não foi cadastrada.";
                lblValidation.Visible = true;
                return false;
            }

            if (IsAdmin)
                Nome_Grupo = ddlGrupoDepto.Text.Trim();
            else
                Nome_Grupo = lblGrupoDepto.Text;

            Presidente = tbPresidente.Text;
            Data_Fundacao = DateTime.Parse(tbDataFundacao.Text);
            Assessor_Nome = tbAssessor.Text;
            Assessor_Telefone = tbAssTelefone.Text;
            Assessor_Email = tbAssEmail.Text;
            Dia_Reuniao = ddlDiaReuniao.Text;
            Hora_Inicio = hora_inicio.ToShortTimeString();
            Hora_Final = hora_final.ToShortTimeString();
            Texto_Resumido = TextResumido.Text.Trim();
            Texto_Completo = TextCompleto.Text.Trim();

            return true;
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            if (!ValidateControls())
                return;

            IEQ_Data data = new IEQ_Data();
            IEQ_DAL.DsGrupoDeptoTableAdapters.IEQ_GRUPO_DEPTOTableAdapter da = new IEQ_DAL.DsGrupoDeptoTableAdapters.IEQ_GRUPO_DEPTOTableAdapter();
            try
            {
                DsGrupoDepto.IEQ_GRUPO_DEPTODataTable dtGrupoDepto = da.GetDataByNome(Nome_Grupo);
                DsGrupoDepto.IEQ_GRUPO_DEPTORow row = dtGrupoDepto.FindByID_GRUPO_DEPTO(CurrentGrupoDepto.ID_GRUPO_DEPTO);
                if (row == null)
                {
                    row = dtGrupoDepto.NewIEQ_GRUPO_DEPTORow();
                    SetGrupoDepto(row);
                    dtGrupoDepto.Rows.Add(row);
                    data.UpdateGrupoDpto(dtGrupoDepto);
                }
                else
                {
                    SetGrupoDepto(row);
                    data.UpdateGrupoDpto(dtGrupoDepto);
                }

                if (updateImage)
                {
                    CurrentGrupoDepto = IEQ_Data.GetGrupoDeptoRow(Nome_Grupo);
                    LoadFotoGrupoDepto(Nome_Grupo);
                    ImgUpdatePanel.Update();
                }

            }
            catch (Exception ex)
            {
                Session.Add("MsgError", ex.Message);
                Response.Redirect("\\PageError.aspx");
            }
        }

        private void SetGrupoDepto(DsGrupoDepto.IEQ_GRUPO_DEPTORow row)
        {
            row.NOME = Nome_Grupo;
            row.PRESIDENTE = Presidente;
            row.DATA_FUNDACAO = Data_Fundacao;
            row.ASS_COMUN_NOME = Assessor_Nome;
            row.ASS_COMUN_TELEFONE = Assessor_Telefone;
            row.ASS_COMUN_EMAIL = Assessor_Email;
            row.DESCRICAO_RESUMIDA = Texto_Resumido;
            row.DESCRICAO_COMPLETA = Texto_Completo;
            row.DIA_REUNIAO = Dia_Reuniao;
            row.HORA_REUNIAO_INICIO = Hora_Inicio;
            row.HORA_REUNIAO_FINAL = Hora_Final;
            row.FOTO_APRESENTACAO = Foto;
            row.APROVADO = false;
        }

        protected void ddlGrupoDepto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (ViewState[KEY_NOME_GRUPO_DEPTO] == null)
                    ViewState.Add(KEY_NOME_GRUPO_DEPTO, ddlGrupoDepto.SelectedValue);
            }
            else
            {
                LoadControls();
            }
        }
    }
}